#include "FileUtil.h"
#include "StringUtil.h"
#ifdef CXX_LESS_17
#include <sys/stat.h>
#endif

AMCAX_EXCHANGE_NAMESPACE_BEGIN 
namespace FileUtil 
{
     std::string GetFilenameWithoutExtension(const std::string &path)
    {
#ifndef CXX_LESS_17
        if (path.empty()) {
            return "" ;
        }
        return std::filesystem::path(path).stem().string();
#else
        // 获取文件名起始位置（最后一个 / 或 \ 之后）
        size_t slashPos = path.find_last_of("/\\");
        size_t start = (slashPos == std::string::npos) ? 0 : slashPos + 1;

        // 获取扩展名前的位置（最后一个点）
        size_t dotPos = path.find_last_of('.');

        // 点如果在文件名部分之外（例如在目录名中），忽略
        if (dotPos == std::string::npos || dotPos < start) {
            dotPos = path.length();
        }

        return path.substr(start, dotPos - start);
#endif
    }

    std::string GetExtension(const std::string &path)
    {
#ifndef CXX_LESS_17
        return StringUtil::ToLowerCase(std::filesystem::path(path).extension().string());
#else
        // 找最后一个斜杠（表示路径分隔）
        size_t slashPos = path.find_last_of("/\\");
        size_t dotPos = path.find_last_of('.');

        // 点不存在或在路径前面，说明没有扩展名
        if (dotPos == std::string::npos || (slashPos != std::string::npos && dotPos < slashPos)) {
            return "";
        }

        return path.substr(dotPos);
#endif
    }

    bool IsFileExist(const std::string &path)
    {
#ifndef CXX_LESS_17
        return std::filesystem::exists(path) && std::filesystem::is_regular_file(path);
#else 
        struct stat buffer;
        return (stat(path.c_str(), &buffer) == 0); // 如果返回0，路径存在
#endif
    }

    bool IsDirExist(const std::string &path)
    {
#ifndef CXX_LESS_17
        return std::filesystem::exists(path) && std::filesystem::is_directory(path);
#else
        struct stat buffer;
        // 检查路径是否存在且是一个目录
        if (stat(path.c_str(), &buffer) == 0) {
            return S_ISDIR(buffer.st_mode);  // 判断是否是目录
        }
        return false;  // 如果路径不存在或不是目录
#endif
    }

#ifndef CXX_LESS_17
    void TraverseDirectory(const std::filesystem::path &path, std::vector<std::string> *containers)
    {
        for (const auto &entry : std::filesystem::directory_iterator(path))
        {
            if (entry.is_directory())
            {
                TraverseDirectory(entry.path(), containers); // 递归遍历子目录
            }
            else
            {
                containers->emplace_back(entry.path().string());
            }
        }
    }
#endif


#ifndef CXX_LESS_17
#else
    std::string GetParentPath(const std::string& path) {
        if (path.empty()) return "";

        // 去掉末尾的斜杠
        size_t end = path.length();
        while (end > 0 && (path[end - 1] == '/' || path[end - 1] == '\\')) {
            --end;
        }

        size_t pos = path.find_last_of("/\\", end - 1);
        if (pos == std::string::npos) {
            return ".";  // 当前目录
        }

        return path.substr(0, pos);
        
    }

#endif
}

AMCAX_EXCHANGE_NAMESPACE_END